package cn.dyp.com.logprint.action;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Element;

import android.content.Context;
import android.content.Intent;

import cn.dyp.com.logprint.bean.LogBean;
import cn.dyp.com.logprint.util.Util;


/**
 * 基础action类，能根据协议类型分别调用jason和soap相关的解析函数， 具体的jason和soap解析函数要求子类实现
 * 
 * @author asus
 *
 */
public abstract class BaseAction {
	// jason和soap协议类型
	public static final String TYPE_JASON = "jason";
	public static final String TYPE_SOAP = "soap";

	// 通信协议类型
	private String type = "";

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	protected String username = "";

	public String getUsername() {
		return username;
	}

	protected String logMsg = "";

	public String getLogMsg() {
		return logMsg;
	}

	protected String logObj = "";

	public String getLogObj() {
		return logObj;
	}

	/**
	 * 根据协议类型分别调用jason和soap相关的解析函数
	 * 
	 * @param param
	 *            待解析的数据
	 * @return 服务器返回的Jason数据
	 */
	public String porcessAction(String param) {
		String resultStr = null;
		if (type.equals(TYPE_JASON)) {
			try {
				JSONObject jsonRequest = new JSONObject(param);
				// 解析用户名
				if (jsonRequest.has("username")) {
					username = jsonRequest.getString("username");
				}
			} catch (JSONException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

			// 处理jason类型的请求
			resultStr = jasonPorcess(param);
			if (resultStr == null) {
				resultStr = "{'result':'failed'}";
			}
		} else if (type.equals(TYPE_SOAP)) {
			// get username
			Element soapBodyEle = Util.getSoapBodyElement(param);
			if (soapBodyEle != null) {
				// 解析用户名
				username = Util
						.getChildElementValueStr(soapBodyEle, "username");
			}

			// 处理soap类型的请求
			resultStr = soapPorcess(param);
			if (resultStr == null) {
				resultStr = Util.getSoapXml(Util.getXmlElementStr("result",
						"failed"));
			}
		} else {
			// 如果是jason和soap以外的协议类型，则返回协议错误，目前只支持jason和soap协议类型
			resultStr = "Protocol error";
		}
		return resultStr;
	}

	/**
	 * jason协议的解析函数，要求子类实现
	 * 
	 * @param param
	 *            待解析的数据
	 * @return 要发送的数据
	 */
	protected abstract String jasonPorcess(String param);

	/**
	 * soap协议的解析函数，要求子类实现
	 * 
	 * @param param
	 *            待解析的数据
	 * @return 要发送的数据
	 */
	protected abstract String soapPorcess(String param);

	/**
	 * 根据协议类型和action，解析协议内容并返回相关结果
	 * 
	 * @param actionType
	 *            协议类型，目前支持jason和soap
	 * @param actionName
	 *            动作名称
	 * @param strBody
	 *            客户端请求body
	 * @param context
	 *            app上下文
	 * @return 返回相关请求的处理结果
	 */
	public static String disposeAction(String communType, String actionType,
			String actionName, String strBody, Context context, String clientIp) {
		String httpResp = "Can't find action";
		if (!actionName.equals("") && !actionType.equals("")) {
			BaseAction action = null;
			if (actionName.equals(LoginAction.TAG)) {
				action = new LoginAction(context); // 用户登录请求处理类
			} else if (actionName.equals(RegisterAction.TAG)) {
				action = new RegisterAction(context);// 用户注册请求处理类
			} else if (actionName.equals(FindPwdAction.TAG)) {
				action = new FindPwdAction(context);// 用户找回密码请求处理类
			} else if (actionName.equals(GetSensorAction.TAG)) {
				action = new GetSensorAction();// 获取传感器数据请求处理类
			} else if (actionName.equals(GetConfigAction.TAG)) {
				action = new GetConfigAction(context);// 获取所有传感器阀值的请求处理类
			} else if (actionName.equals(SetConfigAction.TAG)) {
				action = new SetConfigAction(context);// 设置所有传感器阀值请求处理类
			} else if (actionName.equals(ControlAction.TAG)) {
				action = new ControlAction(context);// 控制器请求处理类
			} else if (actionName.equals(GetControllerStatusAction.TAG)) {
				action = new GetControllerStatusAction();// 获取所有控制器状态的请求处理类
			}

			if (action != null) {
				action.setType(actionType);
				// 处理相关请求，并返回结果
				httpResp = action.porcessAction(strBody);
				//构建日志内容
				SimpleDateFormat dateFormat = new SimpleDateFormat(
						"yyyy-MM-dd HH:mm:ss",Locale.CHINESE);
				LogBean logBean = new LogBean();
				logBean.setDate(dateFormat.format(new Date()));
				logBean.setClientIP(clientIp);
				logBean.setUsername(action.getUsername());
				logBean.setOperationType(actionType);
				logBean.setOperationObj(action.getLogObj());
				if (action.getLogMsg().equals("")) {
					logBean.setLogMsg(httpResp);
				} else {
					logBean.setLogMsg(action.getLogMsg());
				}
				Intent intent = new Intent(
						"com.lenovo.agriculture.server.broadcat.saveLog");
				intent.putExtra("log_message", logBean.toString());
				context.sendBroadcast(intent);
			}
		}
		return httpResp;
	}
}
